package es.albarregas.dao;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;



import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import es.albarregas.modelo.Producto;
import es.albarregas.pojo.Pedido;

public class ProductoDAO extends ConexionDAO {

	public Collection<Producto> leerProducto(String clausulaWhere) {
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			String consultaSQL = "select Codigo,Concepto,Descripcion,alto,ancho,profundidad,CodigoProveedor,Precio,"
					+ "Stock,StockMinimo,Foto,date_format(FechaIntro,'%d-%m-%Y') as fecha, "
					+ "FueraCatalogo, Promocion,FechaIntro as FechaSinFormatear from productos "
					+ clausulaWhere;
			resultado = estamento.executeQuery(consultaSQL);
			System.out.println("consulta leer ProductoDAO " + consultaSQL);
			while (resultado.next()) {
				Producto producto = new Producto();
				producto.setCodigo(resultado.getString("Codigo"));
				producto.setConcepto(resultado.getString("Concepto"));
				producto.setDescripcion(resultado.getString("Descripcion"));

				producto.setCodigoProveedor(resultado
						.getShort("CodigoProveedor"));
				producto.setPrecio(resultado.getDouble("Precio"));
				producto.setStock(resultado.getInt("Stock"));
				producto.setAlto(resultado.getDouble("alto"));
				producto.setAncho(resultado.getDouble("ancho"));
				producto.setProfundidad(resultado.getDouble("profundidad"));
				producto.setStockMinimo(resultado.getInt("StockMinimo"));
				producto.setFoto(resultado.getString("Foto"));
				producto.setFechaIntro(resultado.getString("fecha"));
				producto.setFueraCatalogo(resultado.getString("FueraCatalogo"));
				producto.setPromocion(resultado.getString("Promocion"));
				producto.setFechaSinFormatear(resultado.getString("fechaSinFormatear"));
				String Alerta="normal";
				if(producto.getFueraCatalogo().equals("S")){
				    Alerta="gris";
				}else if(producto.getStock()<=0 ){
				    Alerta="roja";
				}else if(producto.getStock()-producto.getStockMinimo()<=0){
				    Alerta="amarilla";
				}				
				producto.setAlerta(Alerta);
				lista.add(producto);
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		System.out.println("Coleccion en leerProducto " + lista.isEmpty());
		return lista;

	}

	public String codigoSiguienteParaCategoriaColeccion(
			String categoriacoleccion) {
		String codigo = "001";
		try {
			estamento = conexion.createStatement();
			String ConsultaSQL = "SELECT MAX(Codigo) as Codigo FROM productos where codigo like '"
					+ categoriacoleccion + "%'";
			System.out.println("ConsultaSQL ultimo producto" + ConsultaSQL);
			resultado = estamento.executeQuery(ConsultaSQL);
			while (resultado.next() && resultado.getString("Codigo") != null) {
				String codigoCompleto = resultado.getString("Codigo");
				Integer codigoEntero = Integer.parseInt(codigoCompleto
						.substring(4, codigoCompleto.length()));
				codigo = String.valueOf(codigoEntero + 1);
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		while (codigo.length() < 3) {
			codigo = "0" + codigo;
		}
		return codigo;
	}

	public void crearNuevoProducto(HttpServletRequest request,String ubicacionArchivo)
			throws ServletException, IOException {
		String INSERT_STATEMENT = "insert into productos "
				+ "(Concepto,Descripcion,Alto,Ancho,Profundidad,Foto,Precio,Stock,StockMinimo,CodigoProveedor,FueraCatalogo,Promocion, Codigo,FechaIntro) "
				+ "values(?,?,?,?,?,?,?,?,?,?,?,?,?,now())";
		try {
			int i = 1;
			getConexion();
			// String numero = "";
			preparada = conexion.prepareStatement(INSERT_STATEMENT);
			FileItemFactory factory = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setHeaderEncoding("UTF-8");
			List<FileItem> items = upload.parseRequest(request);
			
			System.err.println(ubicacionArchivo);
			File base = new File(ubicacionArchivo+"/img/muebles");
			
			//File base = new File("C:/Dropbox/06_FP/2�_DAW/02_DWES/02_COPIAS DE SEGURIDAD/pabloGonzalezTiendaMuebles/WebContent/img/muebles");
			String codigoColeccionCategoria = "";
			String codigoProducto = "";
			for (Object item : items) {
				FileItem uploaded = (FileItem) item;
				// uploaded.isFormField es para los parametros del formulario
				// que no son type file(vamos todos los normales)
				if (uploaded.isFormField()) {
					String nombreParam = uploaded.getFieldName();
					// System.out.println("KEY --> "+key);
					if (!nombreParam.equals("accion")
							&& !nombreParam.equals("categoria")
							&& !nombreParam.equals("coleccion")) {
						String valor = new String(uploaded.getString()
								.getBytes("ISO-8859-1"), "UTF-8");
						System.out.println(nombreParam + " --> " + valor
								+ " posicion-->" + i);
						preparada.setString(i, valor);
						i++;
					}
					if (nombreParam.equals("coleccion")
							|| nombreParam.equals("categoria")) {
						codigoColeccionCategoria += uploaded.getString();
					}
				} else {
					base.mkdirs();
					codigoProducto = codigoColeccionCategoria
							+ codigoSiguienteParaCategoriaColeccion(codigoColeccionCategoria);
					System.out.println("nombre del archivo"
							+ uploaded.getFieldName());

					String nombreArchivo = uploaded.getName();
					String extension = nombreArchivo.substring(nombreArchivo
							.lastIndexOf("."));
					File fichero = new File(base, codigoProducto + extension); // NOMBRE
																				// Y
																				// EXTENSI�N
					uploaded.write(fichero);
					preparada.setString(i, "img/muebles/" + codigoProducto
							+ extension);
					i++;
					System.out.println(uploaded.getFieldName());
				}
			}
			System.out.println("posicion-->" + i + " codigoProducto-->"
					+ codigoProducto);
			preparada.setString(i, codigoProducto);
			preparada.executeUpdate();
		} catch (SQLException e) {
			System.out.println(e.getErrorCode());
			e.printStackTrace();
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			cerrar();
		}

	}

	public void BorrarProducto(String clausulaWhere) {
		int codigoSQL = 0;
		try {
			getConexion();
			String sentenciaSQL = "DELETE from productos " + clausulaWhere;
			// TODO QUITAR
			System.out.println("Consulta para eliminar productos -->"
					+ sentenciaSQL);
			estamento = conexion.createStatement();
			estamento.executeUpdate(sentenciaSQL);
		} catch (SQLException ex) {
			codigoSQL = ex.getErrorCode();
			ex.printStackTrace();
		} finally {
			cerrar();
		}

	}

	public int updateProducto(Producto producto) {
		int codigoSQL = 0;

		String cadenaSQL = "UPDATE productos SET Codigo =?,Concepto = ?,Descripcion = ?,CodigoProveedor =?,"
				+ "Precio = ?,Stock = ?,StockMinimo = ?,Foto = ?,FechaIntro = ?,FueraCatalogo = ?,"
				+ "Alto = ?,Ancho = ?,Profundidad = ?,Promocion =? WHERE Codigo = ?";
		try {
			getConexion();
			preparada = conexion.prepareStatement(cadenaSQL);
			preparada.setString(1, producto.getCodigo());
			preparada.setString(2, producto.getConcepto());
			preparada.setString(3, producto.getDescripcion());
			preparada.setInt(4, producto.getCodigoProveedor());
			preparada.setDouble(5, producto.getPrecio());
			preparada.setInt(6, producto.getStock());
			preparada.setInt(7, producto.getStockMinimo());
			preparada.setString(8, producto.getFoto());
			preparada.setString(9, producto.getFechaIntro());
			preparada.setString(10, producto.getFueraCatalogo());
			preparada.setDouble(11, producto.getAlto());
			preparada.setDouble(12, producto.getAncho());
			preparada.setDouble(13, producto.getProfundidad());
			preparada.setString(14, producto.getPromocion());
			preparada.setString(15, producto.getCodigo());

			preparada.executeUpdate();
		} catch (SQLException ex) {
			codigoSQL = ex.getErrorCode();
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		return codigoSQL;
	}

	public Producto rellenarProductoMultipart(HttpServletRequest request) {
		Producto producto=new Producto();
		try{
		
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		List<FileItem> items = upload.parseRequest(request);
		File base = new File("C:/Dropbox/06_FP/2�_DAW/02_DWES/02_COPIAS DE SEGURIDAD/pabloGonzalezTiendaMuebles/WebContent/img/muebles");
		String codigoProducto="";		
		String nombreParam="";
		Collection<Producto> listaProductos=null;
		for (Object item : items) {
			FileItem uploaded = (FileItem) item;
			nombreParam = uploaded.getFieldName();
            //uploaded.isFormField es para los parametros del formulario que no son type file(vamos todos los normales)
			if (uploaded.isFormField()) {				
				if(!nombreParam.equals("accion") && !nombreParam.equals("categoria") && !nombreParam.equals("coleccion")){
					String valor =new String (uploaded.getString().getBytes("ISO-8859-1"), "UTF-8");
					System.out.println("nombreParam --> "+nombreParam+"--Valor--> "+valor);	 				 
					 
					if(nombreParam.equals("codigo")){
						listaProductos=leerProducto(" where codigo='"+valor+"'");
						for (Producto producto2 : listaProductos) {
							producto=producto2;
						}					
					}else if (nombreParam.equals("concepto")){
						producto.setConcepto(valor);
					}else if (nombreParam.equals("descripcion")){
						producto.setDescripcion(valor);
					}else if (nombreParam.equals("codigoProveedor")){
						producto.setCodigoProveedor(Short.parseShort((valor)));
					}else if (nombreParam.equals("precio")){
						producto.setPrecio(Double.parseDouble(valor));
					}else if (nombreParam.equals("stock")){
						producto.setStock(Integer.parseInt(valor));
					}else if (nombreParam.equals("stockMinimo")){
						producto.setStockMinimo(Integer.parseInt(valor));
					}else if (nombreParam.equals("fueraCatalogo")){
						producto.setFueraCatalogo(valor);
					}else if (nombreParam.equals("promocion")){
						producto.setPromocion(valor);
					}else if (nombreParam.equals("alto")){
					    
					    Double aDoble=Double.parseDouble(valor);
						producto.setAlto(aDoble);
						
					}else if (nombreParam.equals("ancho")){
						producto.setAncho(Double.parseDouble(valor));
					}else if (nombreParam.equals("profundidad")){
						producto.setProfundidad(Double.parseDouble(valor));
					}			
				}				
			} else {				
				if(!uploaded.getName().equals("") ){
				base.mkdirs();
				String  nombreArchivo=uploaded.getName();							
				String extension=nombreArchivo.substring(nombreArchivo.lastIndexOf("."));
				File fichero = new File(base, producto.getCodigo()+extension);	//NOMBRE Y EXTENSI�N
				uploaded.write(fichero);
				producto.setFoto("img/muebles/"+producto.getCodigo()+extension);
				System.out.println(uploaded.getFieldName());			
				}			
			}
			//TODO QUITAR
			System.out.println("Contenido de producto "+producto.toString());
		}
		
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String[] fechaReformateada=producto.getFechaIntro().split("-");
		producto.setFechaIntro(fechaReformateada[2]+fechaReformateada[1]+fechaReformateada[0]);
		return producto;
	}

	public int updateProducto(HttpServletRequest request) {
		int codigoSQL = 0;

		String cadenaSQL = "UPDATE productos SET Codigo =?,Concepto = ?,Descripcion = ?,CodigoProveedor =?,"
				+ "Precio = ?,Stock = ?,StockMinimo = ?,Foto = ?,FechaIntro = ?,FueraCatalogo = ?,"
				+ "Alto = ?,Ancho = ?,Profundidad = ?,Promocion =? WHERE Codigo = ?";		
		
		try {
			
			Producto producto=rellenarProductoMultipart(request);			
			getConexion();
			preparada = conexion.prepareStatement(cadenaSQL);
			preparada.setString(1, producto.getCodigo());
			preparada.setString(2, producto.getConcepto());
			preparada.setString(3, producto.getDescripcion());
			preparada.setInt(4, producto.getCodigoProveedor());
			preparada.setDouble(5, producto.getPrecio());
			preparada.setInt(6, producto.getStock());
			preparada.setInt(7, producto.getStockMinimo());
			preparada.setString(8, producto.getFoto());
			preparada.setString(9, producto.getFechaIntro());
			preparada.setString(10, producto.getFueraCatalogo());
			preparada.setDouble(11, producto.getAlto());
			preparada.setDouble(12, producto.getAncho());
			preparada.setDouble(13, producto.getProfundidad());
			preparada.setString(14, producto.getPromocion());
			preparada.setString(15, producto.getCodigo());
			System.out.println("Contenido de preparada  "+preparada.toString());
			preparada.executeUpdate();
		} catch (SQLException ex) {
			codigoSQL = ex.getErrorCode();
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		return codigoSQL;
	}

}
